// 剑指 Offer Problem Nr. 58-II: 左旋转字符串

/*
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
请定义一个函数实现字符串左旋转操作的功能。
比如，输入字符串"abcdefg"和数字2，该函数将返回左旋转两位得到的结果"cdefgab"。

示例 1：
	输入: s = "abcdefg", k = 2
	输出: "cdefgab"

示例 2：
	输入: s = "lrloseumgh", k = 6
	输出: "umghlrlose"

限制：
    1 <= k < s.length <= 10000

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/

package main

func reverseLeftWords(s string, n int) string {
	return method1(s, n)
}

func method1(s string, n int) string {
	r := []rune(s)
	var left int
	var right int

	// 左边部分
	left, right = 0, n - 1
	for left < right {
		r[left], r[right] = r[right], r[left]
		left += 1
		right -= 1
	}

	// 右边部分
	left, right = n, len(s) - 1
	for left < right {
		r[left], r[right] = r[right], r[left]
		left += 1
		right -= 1
	}

	// 全体
	left, right = 0, len(s) - 1
	for left < right {
		r[left], r[right] = r[right], r[left]
		left += 1
		right -= 1
	}

	return string(r)
}

func method2(s string, n int) string {
    bytes := make([]byte, len(s))
    for i, ch := range s {
        bytes[i] = byte(ch)
    }
    leftPart := bytes[:n]
    rightPart := bytes[n:]
    bytes = append(rightPart, leftPart...)
    return string(bytes)
}
